運算元(operands)和運算子(operators)是進行數學、邏輯或其他類型計算的基本元素,以下是他們的樣子,接下來就要依據他們的用途做各種分類說明!
運算子:對於變數和值進行運算的符號,如
+
、-
、*
。
運算元:被操作的對象,如數字、變量或表達式。
if
, else
, switch
)根據不同的條件陳述式
執行不同的代碼,常見的條件陳述式有 if
、else
和 switch
。
簡單來說,一個流程判斷式,如果成立要做什麼事情,不成立又要做什麼事情,下圖是用 if...else if...else
畫成一個流程圖說明。
if...else if...else
陳述式
if (condition1) {
// 當 condition1 為 true 時執行的代碼
} else if (condition2) {
// 當 condition1 為 false 且 condition2 為 true 時執行的代碼
} else {
// 當所有條件都為 false 時執行的代碼
}
🔔 如果是簡單的判斷條件,也就是非黑即白的那種,可以使用條件運算子(三元運算子)
condition ? expr1 : expr2
(true ? 'Yes' : 'No'
結果為 'Yes')🔔 如果條件結果極有可能是
null
或undefined
,可以使用空值合并运算符(??)leftExpr ?? rightExpr
(左邊的值是null
或者undefined
就會返回右邊的值)
switch
陳述式
switch (expression) {
case value1:
// 當 expression 等於 value1 時執行的代碼
break;
case value2:
// 當 expression 等於 value2 時執行的代碼
break;
default:
// 當 expression 不等於任何 case 值時執行的代碼
}
🔔
if...else
瀏覽器在渲染或編譯的時候,會全部跑一次,所以在編譯的速度和效能上,如果條件很多,會比switch
效能差,因為switch
只會檢視 case 有無符合,才會去跑程式碼,而不是裡面的東西都檢視過一次。
if...else if...else
:一個範圍的時候,例如,介於某區間 ,大於小於多少。switch
:一個特定的明確case
做比對時,尤其是處理大量的離散值時性能更好。
✍🏻 範例:codewars <6kyu> Who likes it?
Implement the function which takes an array containing the names of people that like an item. It must return the display text as shown in the examples:
中譯:實作一個函數,該函數接受一個包含喜歡某個項目的人的姓名的陣列。它必須返回顯示文本,如範例所示
[] --> "no one likes this"
["Peter"] --> "Peter likes this"
["Jacob", "Alex"] --> "Jacob and Alex like this"
["Max", "John", "Mark"] --> "Max, John and Mark like this"
["Alex", "Jacob", "Mark", "Max"] --> "Alex, Jacob and 2 others like this"
My answer:
以下個別用條件陳述式編輯出符合需求的函式
function likes(names) {
if (names.length === 0) return "no one likes this";
else if (names.length === 1) return `${names[0]} likes this`;
else if (names.length === 2) return `${names.join(" and ")} like this`;
else if (names.length === 3) return `${names[0]}, ${names[1]} and ${names[2]} like this`;
else return `${names[0]}, ${names[1]} and ${names.length - 2} others like this`;
}
function likes(names) {
switch (names.length) {
case 0:
return "no one likes this";
case 1:
return `${names[0]} likes this`;
case 2:
return `${names.join(" and ")} like this`;
case 3:
return `${names[0]}, ${names[1]} and ${names[2]} like this`;
default:
return `${names[0]}, ${names[1]} and ${ names.length - 2 } others like this`;
}
}
for
, while
)在 JavaScript 中,迴圈 loops 用於重複執行一段代碼,直到某個條件滿足為止。
常見的迴圈語句有以下這些,這裡因為實戰上只有用到 for
和 while
,所以會針對這 2 項分享。
for
:多次循環一段代碼 -> 使用頻率算高,畢竟不是所有陣列都能使用 forEach
for...in
:循環遍歷對象的屬性for...of
:循環遍歷可迭代對象的值while
:指定條件為真時循環代碼塊 -> 到目前為止只有在做 echart 的客製化需求用到過do...while
:當指定的條件為真時,還循環一段代碼for
這個迴圈適合當知道要跑多少次時使用比較好,因為她是三個部分組成:
第一次
迴圈變量。true
時繼續執行,為 false
時停止。for (initialization; condition; update) {
// 每次迴圈執行的代碼
}
✍🏻 範例:codewars <6kyu> Build Tower
☆☆☆
Build a pyramid-shaped tower, as an array/list of strings, given a positive integer number of floors. A tower block is represented with "*
" character.
For example, a tower with 3 floors looks like this:
中譯:建構一座金字塔形塔,作為字串陣列/列表,給定正整數層數。塔樓以 "*
" 字元表示。
[
" * ",
" *** ",
"*****"
]
And a tower with 6 floors looks like this:
[
" * ",
" *** ",
" ***** ",
" ******* ",
" ********* ",
"***********"
]
My answer:
一開始的我看到這個題目,我只有想到用 2 個以上的迴圈把星星和空位喬出來,好不容易弄出來提交結果被測試說,結果可行但是花的時間太長會被拒絕通關,後來查到可以用單迴圈搭配 String.repeat()
就可以節省跑回圈的時間,才嘗試理解以下程式碼:
function towerBuilder(nFloors) {
let tower = [];
for (let i = 1; i <= nFloors; i++) {
// 計算每層前導和後綴空格數量,假設有三層,第 3 層空格數 0;第 2 層的空格是 1
let numSpaces = nFloors - i;
// 計算每層星星數量,假設有三層,第 3 層有 5 顆星;第 2 層有 3 顆星
let numStars = 2 * i - 1;
// 組每層的字串(前導空格 + 星號 + 後綴空格)
let floor = `${" ".repeat(numSpaces)}${"*".repeat(numStars)}${" ".repeat(numSpaces)}`;
// 將這層添加到塔的數組中
tower.push(floor);
}
return tower;
}
while
循環的目的是為了反复執行語句或代碼塊,只要指定條件為 true
,循環就可以一直執行代碼塊,直到指定條件變成 false
,跳出循環。
while (condition) {
// 每次迴圈執行的代碼
}
✍🏻 範例:
FizzBuzz 是一個簡單的小遊戲,給定一串從 1 到 100 的數字:
// input 輸入
fizzBuzz100()
// output 輸出
["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"......後續省略]
My answer:
function fizzBuzz100() {
let result = [];
let count = 1;
while (count <= 100) {
// 同時是 3 和 5 的倍數
if (count % 3 === 0 && count % 5 === 0) result.push("FizzBuzz");
// 是 3 的倍數
else if (count % 3 === 0) result.push("Fizz");
// 是 5 的倍數
else if (count % 5 === 0) result.push("Buzz");
// 不是 3 和 5 的倍數,轉為字串添加到結果中
else result.push(count.toString());
// 計數器增加 1
count++;
}
return result;
}